package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

import javax.swing.JFrame;
import javax.swing.table.AbstractTableModel;

import modelo.Datos;
import modelo.DetalleOrden;
import modelo.Producto;
import vista.DlgListadoVentas;

public class ContListadoVentas {
	private class Detalle {
		public Detalle(Producto pr) {
			producto = pr;
			cantidad = 0;
			for (DetalleOrden det : Datos.getInstancia().getDetallesOrden().detallesPorProducto(pr.getCodigo()))
				cantidad += det.getCantidad();
			monto = cantidad * pr.getPrecio();
		}
		
		Producto producto;
		int cantidad;
		double monto;
	}
	
	private DlgListadoVentas dlg = null;
	private AbstractTableModel tmodelo = null;
	private Detalle[] lista = null;
	
	public ContListadoVentas() {
	}
	
	public void mostrar(JFrame frame) {
		dlg = new DlgListadoVentas(frame, this);
		dlg.setLocationRelativeTo(null);
		dlg.setVisible(true);
		
		ArrayList<Producto> lst = Datos.getInstancia().getProductos().productosGeneral();
		lista = new Detalle[lst.size()];
		for (int i = 0; i < lst.size(); ++i)
			lista[i] = new Detalle(lst.get(i));

		Arrays.sort(lista, new Comparator<Detalle>() {
			@Override
			public int compare(Detalle a, Detalle b) {
				return -Double.compare(a.monto, b.monto);
			}
		});
		
		tmodelo = new AbstractTableModel() {
			private static final long serialVersionUID = 1L;

			@Override
			public int getColumnCount() {
				return 3;
			}

			@Override
			public String getColumnName(int col) {
				switch (col) {
				case 0: return "Producto";
				case 1: return "Cantidad";
				case 2: return "Monto";
				}
				return null;
			}

			@Override
			public int getRowCount() {
				return lista.length;
			}

			@Override
			public Object getValueAt(int row, int col) {
				Detalle obj = lista[row]; 
				switch (col) {
				case 0: return obj.producto.getNombre();
				case 1: return obj.cantidad;
				case 2: return String.format("%.2f", obj.monto);
				}
				return null;
			}
		};
		
		dlg.getTblVentas().setModel(tmodelo);
		dlg.getTblVentas().setSelectionMode(0);
		
		dlg.getRbMontoAscendente().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Arrays.sort(lista, new Comparator<Detalle>() {
					@Override
					public int compare(Detalle a, Detalle b) {
						return Double.compare(a.monto, b.monto);
					}
				});
				tmodelo.fireTableDataChanged();
			}
		});
		
		dlg.getRbMontoDescendente().addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Arrays.sort(lista, new Comparator<Detalle>() {
					@Override
					public int compare(Detalle a, Detalle b) {
						return -Double.compare(a.monto, b.monto);
					}
				});
				tmodelo.fireTableDataChanged();
			}
		});
		
		dlg.getRbCantidadAscendente().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Arrays.sort(lista, new Comparator<Detalle>() {
					@Override
					public int compare(Detalle a, Detalle b) {
						return a.cantidad - b.cantidad;
					}
				});
				tmodelo.fireTableDataChanged();
			}
		});
		
		dlg.getRbCantidadDescendente().addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Arrays.sort(lista, new Comparator<Detalle>() {
					@Override
					public int compare(Detalle a, Detalle b) {
						return b.cantidad - a.cantidad;
					}
				});
				tmodelo.fireTableDataChanged();
			}
		});
		
		dlg.getBtSalir().addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				dlg.dispose();
			}
		});
		
		dlg.getRbMontoDescendente().setSelected(true);
	}
}
